package ru.ifmo.network.term8;

import com.sun.jna.Library;
import com.sun.jna.Native;
import com.sun.jna.Structure;

/**
 * Simple example of native C POSIX library declaration and usage.
 */
public class Test {
    public interface POSIX extends Library {
        public int chmod(String filename, int mode);

        public int chown(String filename, int user, int group);

        public int rename(String oldpath, String newpath);

        public int kill(int pid, int signal);

        public int link(String oldpath, String newpath);

        public int mkdir(String path, int mode);

        public int rmdir(String path);

        public int socket(int domain, int type, int protocol);

        public void perror(String s);

        public final int AF_UNIX = 1;
        public final int AF_INET = 2;

        public final int SOCK_STREAM = 1;

        public final int IPPROTO_TCP = 6;

        public class sockaddr_in extends Structure {

        }
    }

    //    int main (int argc, char *argv []) {
// int sd;               /* Дескриптор передающего сокета             */
// FILE *ss;             /* Поток, соответствующий передающему сокету */
// char line [LINE_MAX]; /* Буфер для копируемых строк                */
//			/* Структура - входной аргумент getaddrinfo  */
// struct addrinfo hints = {0, AF_INET, SOCK_STREAM, IPPROTO_TCP,
//			   0, NULL, NULL, NULL};
//			/* Указатель - выходной аргумент getaddrinfo */
// struct addrinfo *addr_res;
// int res;              /* Результат getaddrinfo */
//
// if (argc != 2) {
//   fprintf (stderr, "Использование: %s имя_серверного_хоста\n", argv [0]);
//   return (1);
// }
//
// /* Создадим сокет, через который будем отправлять */
// /* прочитанные строки                             */
// if ((sd = socket (AF_INET, SOCK_STREAM, IPPROTO_TCP)) < 0) {
//   perror ("SOCKET");
//   return (2);
// }
//
// /* Выясним целевой адрес для соединения     */
// /* Воспользуемся портом для сервиса spooler */
// if ((res = getaddrinfo (argv [1], "spooler", &hints, &addr_res)) != 0) {
//   fprintf (stderr, "GETADDRINFO: %s\n", gai_strerror (res));
//   return (3);
// }
//
// /* Воспользуемся функцией connect() для достижения двух целей:    */
// /* установления соединения и привязки к некоему локальному адресу */
// if (connect (sd, addr_res->ai_addr, addr_res->ai_addrlen) < 0) {
//   perror ("CONNECT");
//   return (4);
// }
//
// /* Сформируем поток по дескриптору сокета */
// if ((ss = fdopen (sd, "w")) == NULL) {
//   perror ("FDOPEN");
//   return (5);
// }
// /* Отменим буферизацию для этого потока */
// setbuf (ss, NULL);
//
// /* Цикл чтения строк со стандартного ввода */
// /* и отправки их через сокет в виде потока */
// fputs (MY_PROMPT, stdout);
// while (fgets (line, sizeof (line), stdin) != NULL) {
//   fputs (line, ss);
// }
// shutdown (sd, SHUT_WR);
//
// return (0);
//}
    public static void main(String[] args) {
        POSIX posix = (POSIX) Native.loadLibrary("c", POSIX.class);
        posix.mkdir("/tmp/newdir", 0777);
        posix.rename("/tmp/newdir", "/tmp/renamedir");
        int fd = posix.socket(POSIX.AF_INET, POSIX.SOCK_STREAM, POSIX.IPPROTO_TCP);
        System.out.println(fd);
        posix.perror("SOCKET");
    }
}

